CognitoのカスタムEメール送信者のLambdaトリガーで、AWS Encryption SDK for Pythonを利用して復号してみた
アノテーションの小川です。
Cognito のカスタムEメール送信者のLambdaトリガーのドキュメントには、 Node.js のサンプルが載っています。
Python のサンプルが載っていなかったので、Python を利用して暗号化された内容を復号してみました。
なお、このブログでは KMS でのキーの作成や Cognito の設定には触れていません。
Lambda
ランタイムは Python3.9 で作成しています。
ソースコード
import aws_encryption_sdk from aws_encryption_sdk import CommitmentPolicy import base64 client = aws_encryption_sdk.EncryptionSDKClient( commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT ) kms_key_provider = aws_encryption_sdk.StrictAwsKmsMasterKeyProvider(key_ids=[ 'arn:aws:kms:ap-northeast-1:xxx:key/xxx' ]) def lambda_handler(event, context): code = event["request"]["code"] ciphertext = base64.b64decode(code) plaintext, header = client.decrypt( source=ciphertext, key_provider=kms_key_provider ) print(plaintext)
主に参考にしたドキュメントは以下です。
AWS Encryption SDK for Python のコードの例
レイヤー
上記のソースコードでインポートしている aws_encryption_sdk はデフォルトのLambdaには存在しないため、レイヤーで追加します。
以下の方法でレイヤーを追加しました。
Docker でシミュレートされた Lambda 環境を使用して、Lambda レイヤーを作成する方法を教えてください。
実際には以下のコマンドを実行し、作成した layer.zip を使用してコンソールからレイヤーを作成しました。
mkdir layer cd layer echo aws_encryption_sdk > requirements.txt docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.9" \ /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit" zip -r layer.zip python > /dev/null
IAM ロール
Lambda を作成する際にデフォルトで付与されるポリシー(CloudWatch Logs へログ出力する権限)に加え、kms:Decrypt も許可しています。
復号できるか試してみた
Cognito のホストされた UI から SignUp を行い、Lambda に渡される暗号化された検証コードを復号できるか試してみます。
Lambda のログを確認すると、b'187857'
がログ出力されていました。
187857を入力してみます。
設定していたリダイレクトURLにリダイレクトされ、無事復号できたことがわかりました。
参考資料
AWS Encryption SDK for Python のコードの例
GitHub - aws/aws-encryption-sdk-python
aws-encryption-sdk-python/examples/src
Docker でシミュレートされた Lambda 環境を使用して、Lambda レイヤーを作成する方法を教えてください。
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。